package com.cuz.daileetcode;


/**
 * @author cuzz
 * @version 1.0
 * @description: 给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 *
 * 如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：n = 1
 * 输出：true
 * 解释：20 = 1
 * 示例 2：
 *
 * 输入：n = 16
 * 输出：true
 * 解释：24 = 16
 * 示例 3：
 *
 * 输入：n = 3
 * 输出：false
 * 示例 4：
 *
 * 输入：n = 4
 * 输出：true
 * 示例 5：
 *
 * 输入：n = 5
 * 输出：false
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/power-of-two
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 **/
public class Day5 {
    public static void main(String[] args) {
        System.out.println(S1.isPowerOfTwo(16));
    }

    /**
     * @author cuzz
     * @description 二分
     * @date 22:34 2021/9/22

     **/
    static class S1{

        public static boolean isPowerOfTwo(int n) {
            if (n<1){
                return false;
            }
            if (n==1){
                return true;
            }
            if (n%2!=0){
                return false;
            }
            int start=0;
            int end=n;
            while (end>=start){
                //规避溢出的写法
                int mid=((end-start)>>1)+start;
                double tempValue=Math.pow(2,mid);
                if (tempValue==n){
                    return true;
                }else if (tempValue>n){
                    end=mid-1;
                }else {
                    start=mid+1;
                }
            }
            return false;
        }

    }

    /**
     * @author cuzz
     * @version 1.0
     * @description: 位运算
     * <p>
     * 2的幂次数 n二进制只存在一个1
     * 1：1
     * 2  10
     * 4  100
     * 8  1000
     * <p>
     * n-1二进制
     * 0：0
     * 1：1
     * 3  11
     * 7  111
     * <p>
     * 二者与运算必定为0
     * @date 22:34 2021/9/22
     **/
    static class S2 {

        public static boolean isPowerOfTwo(int n) {
            if (n < 1) {
                return false;
            }
            if (n == 1) {
                return true;
            }
            if (n % 2 != 0) {
                return false;
            }
            return (n & n - 1) == 0;

        }

    }}
